//////////////////////////////////////////////////////////////////////////

#ifndef _OBSERVABLE_H_
#define _OBSERVABLE_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _OBSERVER_H_
#include "observer.h"
#endif

#include <set>

//////////////////////////////////////////////////////////////////////////



/** This class implements Observer design pattern
*
*   Usage: 
*   1. Create a subclass of Observable;
*   2. On every event listed in Observer::Event call NotifyObservers()
*      method with this event as parameter;
*
*  @author   Roman Pasechnik
*  @since    Aug 04th, 2009
*  @updated  Aug 04th, 2009
*/
class Observable
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Destructor */
    virtual ~Observable();


//////////////////////////////////////////////////////////////////////////


    /** Add new observer */
    void AddObserver( Observer* _observer );


    /** Remove existing observer */
    void RemoveObserver( Observer* _observer );


    /** Notify all observers about event */
    void NotifyObservers( Observer::Event _event );


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** [Utility type]: a set of Observer pointers */
    typedef std::set<Observer*> Observers;


    /** All observers, that are observing this object */
    Observers m_Observers;


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////

